home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
games
/
spassion
/
source.lzh
/
SOURCE
/
FuncEnemy
/
ZAKO03.C
< prev
next >
Wrap
Text File
|
2000-03-20
|
3KB
|
128 lines
/*
#include <stdio.h>
#include <iocslib.h>
*/
/* 自機を追いかける */
#include <xsp2lib.h>
#include "../SPASSION.H"
#include "../player.h"
#include "../enemy.h"
#include "../eshot.h"
#include "../effect.h"
#include "../priority.h"
#include "../sound.h"
#include "../entry.h"
#include "../SUB.H"
#ifndef NULL
#define NULL ((void *) 0)
#endif
#define PALET_MAIN 0x0500
short enemy_explode( ENEMY *ene );
static short MoveEnemyZako03(ENEMY *);
/*static void TiniEnemyZako03(ENEMY *);*/
#define P_X (*((short *) (&player[0].lx))) /*lxの上位ワード*/
#define P_Y (*((short *) (&player[0].ly))) /*lyの上位ワード*/
#define PT_ST 0
/* 16x16キャラの当たり判定 */
extern HIT_XY4 hit8_p;
extern HIT_XY4 hit8_o;
extern HIT_XY4 hit8_s;
/* InitEnemyZako00Hitと同じなのでいらない */
void InitEnemyZako03Hit( void )
{
}
void InitEnemyZako03(ENEMY *ene)
{
if( ene->lx > (128+16)<<16 )
ene->vx = -2 * 65536;
else
ene->vx = 2 * 65536;
ene->vy = 0;
ene->hit_p[0] = &hit8_p;ene->hit_p[1]=NULL;
ene->hit_o[0] = &hit8_o;ene->hit_o[1]=NULL;
ene->hit_s[0] = &hit8_s;ene->hit_s[1]=NULL;
ene->hp = 1;
if( ene->lx > (128+16)<<16 )
ene->angle = 192;
else
ene->angle = 64;
ene->no_dead = 0;
ene->func_enemy_move = MoveEnemyZako03;
/* ene->func_enemy_tini = TiniEnemyZako03;*/
/* entry_counter_stop = !0;*/ /* エントリーカウンター停止 */
}
static short MoveEnemyZako03( ENEMY *ene )
{
short tmp;
unsigned char angle;
if( (++ene->count > 4) && ene->state < 32 ) { /* 4 回移動するごとに向き修正、32 回追いかけたら終わり */
tmp = calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y );
tmp = (tmp - ene->angle) & (256 - 1);
if( tmp ) {
if (tmp > 127) ene->angle-=8 ;
else ene->angle+=8 ;
ene->angle &= 256 - 1;
}
ene->vx = vx_tbl[6+ene->arg][ene->angle];
ene->vy = vy_tbl[6+ene->arg][ene->angle];
ene->count=0;
ene->state++;
if( ene->state==16 ){
switch ( level ){
case NOMAL:
MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
SetSE(SE_ESHOT_ENRG); /* 敵ショット音 */
break;
case HARD:
MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
SetSE(SE_ESHOT_ENRG); /* 敵ショット音 */
break;
}
}
}
/* 速度を足して上位ワード(固定整数部)だけ取り出す */
ene->x = ((ene->lx += ene->vx) >> 16)-8; /*-8は表示位置をずらすため*/
ene->y = ((ene->ly += ene->vy) >> 16)-8;
if( ene->state >= 16 ) {
/* 画面外に出たら消去 */
if( ENE_X > 255 + 24 || ENE_Y < 16 - 8 || ENE_Y > 255 + 24 || ENE_Y < 16 - 8 )
return (0);
}
ene->pt = obj_zako_k+PT_ST + pt_rot[ene->angle];
ene->info = PALET_MAIN | PRIORITY_ZAKO | info_rot[ene->angle];
/* ダメージを受けた時の処理 */
if(ene->damage){
MakeEffect(EFFECT_EXPLMINI, 0, ene->x, ene->y);
SetSE(SE_EXPL_S); /* 爆発音 */
ene->player->score += 1;
return (0); /* 消去 */
}
xsp_set_st(ene);
return(1);
}
/*
static void TiniEnemyZako03(ENEMY * p)
{
}
*/